import { Client } from "@stomp/stompjs";
import { getToken } from "@/utils/auth";

class WebSocketManager {
    private client: Client | null = null;
    private messageHandlers: Map<string, ((message: string) => void)[]> =
        new Map();
    private reconnectAttempts = 0;
    private maxReconnectAttempts = 3; // 自定义最大重试次数
    private reconnectDelay = 5000; // 重试延迟（单位：毫秒）

    // 初始化 WebSocket 客户端
    setupWebSocket() {
        const endpoint = import.meta.env.VITE_APP_WS_ENDPOINT;

        // 如果没有配置 WebSocket 端点或显式关闭，直接返回
        if (!endpoint) {
            console.log(
                "WebSocket 已被禁用，如需打开请在配置文件中配置 VITE_APP_WS_ENDPOINT"
            );
            return;
        }

        if (this.client && this.client.connected) {
            console.log("客户端已存在并且连接正常");
            return this.client;
        }

        this.client = new Client({
            brokerURL: endpoint,
            connectHeaders: {
                Authorization: getToken(),
            },
            heartbeatIncoming: 30000,
            heartbeatOutgoing: 30000,
            reconnectDelay: 0, // 设置为 0 禁用重连
            onConnect: () => {
                console.log(`连接到 WebSocket 服务器: ${endpoint}`);
                this.reconnectAttempts = 0; // 重置重连计数
                this.messageHandlers.forEach((handlers, topic) => {
                    handlers.forEach((handler) => {
                        this.subscribeToTopic(topic, handler);
                    });
                });
            },
            onStompError: (frame) => {
                console.error(`连接错误: ${frame.headers["message"]}`);
                console.error(`错误详情: ${frame.body}`);
            },
            onDisconnect: () => {
                console.log(`WebSocket 连接已断开: ${endpoint}`);
                this.reconnectAttempts++;
                if (this.reconnectAttempts < this.maxReconnectAttempts) {
                    console.log(
                        `正在尝试重连... 尝试次数: ${this.reconnectAttempts}`
                    );
                } else {
                    console.log("重连次数已达上限，停止重连");
                    this.client?.deactivate();
                }
            },
        });

        this.client.activate();
    }

    // 订阅主题
    public subscribeToTopic(
        topic: string,
        onMessage: (message: string) => void
    ) {
        console.log(`正在订阅主题: ${topic}`);
        if (!this.client || !this.client.connected) {
            this.setupWebSocket();
        }

        if (this.messageHandlers.has(topic)) {
            this.messageHandlers.get(topic)?.push(onMessage);
        } else {
            this.messageHandlers.set(topic, [onMessage]);
        }

        if (this.client?.connected) {
            this.client.subscribe(topic, (message) => {
                const handlers = this.messageHandlers.get(topic);
                handlers?.forEach((handler) => handler(message.body));
            });
        }
    }

    // 断开 WebSocket 连接
    public disconnect() {
        if (this.client) {
            console.log("断开 WebSocket 连接");
            this.client.deactivate();
            this.client = null;
        }
    }
}

export default new WebSocketManager();
